context("Model")

library("keras")

testthat_model_dir <- tempfile("model_")

teardown({
  mlflow_clear_test_dir(testthat_model_dir)
})

test_that("mlflow can save keras model ", {
  PATH <- Sys.getenv("PATH", "") # keras package modifies PATH which breaks other tests
  mlflow_clear_test_dir(testthat_model_dir)
  model <- keras_model_sequential() %>%
  layer_dense(units = 8, activation = "relu", input_shape = dim(iris)[2] - 1) %>%
  layer_dense(units = 3, activation = "softmax")
  model %>% compile(
    loss = "categorical_crossentropy",
    optimizer = optimizer_rmsprop(),
    metrics = c("accuracy")
  )
  train_x <- as.matrix(iris[, 1:4])
  train_y <- to_categorical(as.numeric(iris[, 5]) - 1, 3)
  model %>% fit(train_x, train_y, epochs = 1)
  model %>% mlflow_save_model(testthat_model_dir)
  expect_true(dir.exists(testthat_model_dir))
  detach("package:keras", unload = TRUE)
  model_reloaded <- mlflow_load_model(testthat_model_dir)
  expect_equal(
    predict(model, train_x),
    predict(model_reloaded, train_x),
  )
  Sys.setenv(PATH = PATH)
})
